#include <iostream>
using namespace std;

//version 1 直接进行循环检测1的个数！
class Solution {
public:
    int hammingWeight(int n) {
        int i = 1, cnt = 0;
        for(int j = 0; j < 32; ++j)
            cnt += ((i << j) & n) > 0;
        return cnt;
    }
};


//version 2 
//既然只是要找1的个数，是不是可以每次都从最右边开始找，每次找到一个就记录一次
//找到最右侧的1的方法：n & (-n)
//把最右侧的1变成0的方法：n & (n - 1)
class Solution {
public:
    int hammingWeight(int n) {
        int cnt = 0;
        while(n){
            n = (n & n - 1);
            ++cnt;
        }
        return cnt;
    }
}; 

//每次都把最右边的1变成0，那么有多少个1，就执行多少次循环。
//大量调用该函数的情况下，效率比第一个高

